package com.hdax.dm.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.hdax.dm.beans.item.ItemType;
import com.hdax.dm.dto.IndexNavDto;
import com.hdax.dm.dto.IndexlineNavDto;
import com.hdax.dm.mappers.ItemTypeMapper;
import com.hdax.dm.mapstucts.IndexNavDtoMapper;
import com.hdax.dm.mapstucts.IndexlineNavDtoMapper;
import com.hdax.dm.service.ItemService;
import com.hdax.dm.service.ItemTypeService;
import com.hdax.dm.utils.response.CommonResponse;
import com.hdax.dm.utils.response.ResponseUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class ItemTypeServiceImpl extends ServiceImpl<ItemTypeMapper,ItemType> implements ItemTypeService {

    @Autowired
    private IndexNavDtoMapper mapper;

    @Autowired
    private IndexlineNavDtoMapper indexlineNavDto;

    @Autowired
    private ItemService itemService;

    @Autowired
    private RedisTemplate redisTemplate;


    @Override
    public CommonResponse<List<IndexNavDto>> navs() {

        List<IndexNavDto> dtos =null;

        //进入该方法后，先判断缓存中是否存在数据库，如果存在则不需要查询数据库
        if (redisTemplate.opsForValue().get("index:nav")==null) {
            /*
            封装MP查询条件  Wrapper
            可以把它想成sql语句中的where条件
            */
            QueryWrapper<ItemType> wrapper = new QueryWrapper<>();
            wrapper.eq("parent",0L);

            /*查询出来所有的数据*/
            List<ItemType> itemTypes = baseMapper.selectList(wrapper);

            /*
            把查询出的数据进行类型转换  转换过程系统自动生成，不用关系，
            如想查看可以查看
            在target->classes文件中Mapstruct中有自动生成的Impl文件
            */
            dtos = mapper.toTargetList(itemTypes);

            for(IndexNavDto dto :dtos){
                QueryWrapper<ItemType> wrapper2 = new QueryWrapper<>();
                wrapper2.eq("parent",dto.getId());

                /*下面这条语句实现过程
                 * 将查询出的所有数据转换成需要的数据类型在赋值给children
                 * */
                dto.setChildren(mapper.toTargetList(baseMapper.selectList(wrapper2)));
                dto.setHotItems(itemService.hotItems(dto.getId(),1L));
            };

            redisTemplate.opsForValue().set("index:nav",dtos);
        }else {
            /*从redis取值*/
            dtos = (List<IndexNavDto>) redisTemplate.opsForValue().get("index:nav");
        }


        return ResponseUtil.returnSuccess(dtos);
    }

    @Override
    public CommonResponse<List<IndexlineNavDto>> linenavs() {
        QueryWrapper<ItemType> wrapper = new QueryWrapper<>();
        wrapper.eq("parent",0L);
        List<ItemType> itemTypes = baseMapper.selectList(wrapper);

        List<IndexlineNavDto> dtos = indexlineNavDto.toTargetList(itemTypes);
        return ResponseUtil.returnSuccess(dtos);
    }
}
